/* ************************************************************************
> File Name:     strtok.c
> Author:        zhfu
> mail:          3346897597@qq.com
> Created Time:  2022年04月27日 星期三 21时29分56秒
> Description:   
 ************************************************************************/
#include<stddef.h>

int indelim(const char *delim, char c)
{
    while (*delim){
        if (*delim++ == c){
            return 1;
        }
    }

    return 0;
}
/*
char *my_strtok(char *str, const char *delim)
{
    static char *str_start = NULL;
    
    char *ret = str;
    if (str){
        while (!indelim(delim, *str) && *str){
            ++str;
        }
        if (*str){
            *str = '\0';
            str_start = ++str;
            if (str == ret){ //出现两个连续的delim时直接进入下一次，忽略这一次
                return my_strtok(NULL, delim);
            }
            return ret;
        }
        else{
            str_start = str;
            return NULL;
        }
    }
    else{
        ret = str_start;
        while (!indelim(delim, *str_start) && *str_start){
            ++str_start;
        }
        if (*str_start){
            *str_start = '\0';
            ++str_start;
            if (str_start == ret + 1){ //出现两个连续的delim时直接进入下一次，忽略这一次//
                return my_strtok(NULL, delim);
            }
            return ret;
        }
        else{
            if (!*ret){
                return NULL;
            }
            return ret;
        }
    }
}
*/

//版本二
char *my_strtok(char *str, const char *delim)
{
    static char *str_start = NULL;

    char **tmp;
    char *ret;

    if (str){
        ret = str;
        str_start = str;
    }
    else{
        ret = str_start;
    }

    tmp = &str_start;

    while (!indelim(delim, **tmp) && **tmp){
        ++*tmp;
    }

    if (**tmp){
        **tmp = '\0';
        ++*tmp;
        if (*tmp == ret + 1){
            return my_strtok(NULL, delim);
        }
        return ret;
    }
    else{
        if (str){
            return NULL;
        }
        else{
            if (ret == *tmp){
                return NULL;
            }
            return ret;
        }
    }


}
